package com.cherry.mvc.controller;

import com.cherry.mvc.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.support.SessionStatus;

import java.util.Map;

/**
 * springmvc注解
 */
@Controller
@RequestMapping(path = "/user/anno", method = RequestMethod.POST)
@SessionAttributes(value = {"msg"})//把msg=美美存入到session域对中
public class UserAnnoParamsController {

    //1.RequestParam 别名
    @RequestMapping(path = "/requestParams")
    public String testRequestParams(@RequestParam("name") String userName) {
        System.out.println(userName);
        return "user";
    }

    //2.获取到请求体的内容
    @RequestMapping(path = "/requestBody")
    public String testRequestBody(@RequestBody String body) {
        System.out.println(body);
        return "user";
    }

    //3.拥有绑定url中的占位符的。
    // Restful风格的URL
    //1. 请求路径一样，可以根据不同的请求方式去执行后台的不同方法
    @RequestMapping(path = "/pathVariable/{id}", method = RequestMethod.GET)
    public String testPathVariable(@PathVariable String id) {
        System.out.println(id);
        return "user";
    }

    //4.RequestHeader
    @RequestMapping(value = "/testRequestHeader", method = RequestMethod.GET)
    public String testRequestHeader(@RequestHeader(value = "Accept") String header) {
        System.out.println(header);
        return "user";
    }

    //5.CookieValue
    @RequestMapping(value = "/testCookieValue", method = RequestMethod.GET)
    public String testCookieValue(@CookieValue(value = "JSESSIONID") String cookieValue) {
        System.out.println(cookieValue);
        return "user";
    }

    /**
     * 6.
     * 1. 作用
     * 1. 出现在方法上：表示当前方法会在控制器方法执行前线执行。
     * 2. 出现在参数上：获取指定的数据给参数赋值。
     * 2. 应用场景
     * 1. 当提交表单数据不是完整的实体数据时，保证没有提交的字段使用数据库原来的数据。
     */
    // 修饰的方法有返回值
//    @ModelAttribute
//    public User showUser(String name) {
//        System.out.println("showUser执行了...");
//        // 通过用户查询数据库（模拟）
//        User user = new User();
//        user.setName(name);
//        user.setAge(10086);
//        return user;
//    }
//
//    @RequestMapping(value = "/testModelAttribute")
//    public String testModelAttribute(User user) {
//        System.out.println(user);
//        return "user";
//    }

    /**
     * 修饰的方法没有返回值，这种方式request域没有拿到值？？？
     */
    @RequestMapping(value = "/testModelAttribute")
    public String testModelAttribute(@ModelAttribute("abc") User user) {
        System.out.println(user);
        return "user";
    }

    @ModelAttribute
    public void showUser(String uname, Map<String, User> map) {
        System.out.println("showUser执行了...");
        // 通过用户查询数据库（模拟）
        User user = new User();
        user.setName(uname);
        user.setAge(20);
        map.put("abc", user);
    }

    /**
     * 存储Request域，并没有存储到Session域，需要存储到session，需要在类上加注解SessionAttributes
     *
     * @param model Model 是 spring 提供的一个接口，该接口有一个实现类 ExtendedModelMap
     *              该类继承了 ModelMap，而 ModelMap 就是 LinkedHashMap 子类
     * @return
     */
    @RequestMapping(value = "/testSessionAttributes", method = RequestMethod.GET)
    public String testSessionAttributes(Model model) {
        System.out.println("testSessionAttributes...");
        // 底层会存储到request域对象中
        model.addAttribute("msg", "美美");
        return "user";
    }

    /**
     * session获取值
     *
     * @param modelMap
     * @return
     */
    @RequestMapping(value = "/getSessionAttributes", method = RequestMethod.GET)
    public String getSessionAttributes(ModelMap modelMap) {
        String msg = (String) modelMap.get("msg");
        System.out.println("getSessionAttributes====" + msg);
        return "user";
    }

    /**
     * 清除session
     *
     * @param status
     * @return
     */
    @RequestMapping(value = "/delSessionAttributes", method = RequestMethod.GET)
    public String delSessionAttributes(SessionStatus status) {
        System.out.println("delSessionAttributes...");
        status.setComplete();
        return "user";
    }


}
